const child_process = require('child_process');

/**
 * 创建新进程，根据指定命令
 * spawn(command,[, args])
 * 运行 ls -lh /usr、捕获 stdout、stderr 和退出码
 */

const ls = child_process.spawn('ls', ['-alh', './']);

ls.stdout.on('data', (data) => {
  console.log('stdout', data.toString())
})

ls.stderr.on('data', (err, data) => {
  if(err) console.log(err);
  console.log(`stderr: ${data}`);
})

ls.on('close', (err, code) => {
  if(err) console.log(err);
  console.log(`子进程已退出，退出码：${code}`);
})

/**
 * 创建一个子进程
 * child_process.exec('ls -hl ', (err, stdout, stderr) => {})
 */
child_process.exec('ls -hl ', (err, stdout, stderr) => {
  if(err) console.log(err.toString());
  console.log(`stdout: ${stdout.toString()}`);
  console.log(`stderr: ${stderr.toString()}`);
})

/**
 * execFile 是spawn和exec的结合版
 */
child_process.execFile('ls', ['-alh', './'], (err, stdout, stderr) => {
  if(err) console.log(err.toString());
  console.log(`stdout: ${stdout.toString()}`);
  console.log(`stderr: ${stderr.toString()}`);
})
child_process.execFile('node',['--version'], (err, stdout, stderr) => {
  err 
  ? console.log(err.toString()) 
  : console.log(`stdout: ${stdout.toString()}`);
})
/**
 * fork
 * child_process.fork() 方法是 child_process.spawn() 的特例，
 * 专门用于衍生新的 Node.js 进程。
 * 与 child_process.spawn() 一样，返回 ChildProcess 对象。
 * 返回的 ChildProcess 将有额外的内置通信通道，允许消息在父进程和子进程之间来回传递
 */